# 雷达相关数据结构定义，张深寿，2021-10-22

# 定义变量别名，便于理解
UINT8 = "B"
UINT16 = "H"
UINT32 = "I"
FLOAT = "f"

class CinradSADFormat(object):

    def __init__(self):
        super(CinradSADFormat, self).__init__()

    def GenericHeader(self): # 通用头块
        return (
            ('MagicNumber', UINT32), # 魔术字。固定标志，用来指示雷达数据文件。
            ('MajorVersion', UINT16), # 主版本号。
            ('MinorVersion', UINT16), # 次版本号。
            ('GenericType', UINT32), # 文件类型。1–基数据文件；2–气象产品文件；
            ('ProductType', UINT32), # 产品类型。文件类型为1时此字段无效。
            ('Reserved', '16s') # 保留字段。16个byte
            )

    def SiteConfig(self): # 站点配置块
        return (
            ('SiteCode', '8s'), # 站号。站号具有唯一性，用来区别不同的雷达站，如Z9010。
            ('SiteName', '32s'), # 站点名称。站点名称，如BeiJing。
            ('Latitude', FLOAT), # 纬度。雷达站天线所在位置纬度。
            ('Longitude', FLOAT), # 经度。雷达站天线所在位置经度。
            ('AntennaHeight', UINT32), # 天线高度。天线馈源水平时海拔高度。
            ('GroundHeight', UINT32), # 地面高度。雷达塔楼地面海拔高度。
            ('Frequency', FLOAT), # 工作频率。
            ('BeamWidthHori', FLOAT), # 水平波束宽度。
            ('BeamWidthVert', FLOAT), # 垂直波束宽度。
            ('RDAVersion', UINT32), # RDA版本号。雷达数据采集软件版本号。
            ('RadarType', UINT16), # 雷达类型。1–SA 2–SB 3–SC 33–CA 34–CB 35–CC 36–CCJ 37–CD 65–XA。
            ('Reserved', '54s') # 保留字段。
            )

    def TaskConfig(self): # 任务配置块
        return (
            ('TaskName', '32s'), # 任务名称。任务名称，如VCP21。
            ('TaskDescription', '128s'), # 任务描述
            ('PolarizationType', UINT32), # 极化方式。1 – 水平极化 2 – 垂直极化 3 – 水平/垂直同时 4 – 水平/垂直交替。
            ('ScanType', UINT32), # 扫描任务类型。0 – 体扫 1–单层PPI 2 – 单层RHI 3 – 单层扇扫 4 – 扇体扫 5 – 多层RHI 6 – 手工扫描
            ('PulseWidth', UINT32), # 脉冲宽度。发射脉冲宽度。
            ('ScanStartTime', UINT32), # 扫描开始时间。扫描开始时间为UTC标准时间计数,1970年1月1日0时为起始计数基准点。
            ('CutNumber', UINT32), # 扫描层数。根据扫描任务类型确定的扫描层数。
            ('HorizontalNoise', FLOAT), # 水平通道噪声。水平通道的噪声电平。
            ('VerticalNoise', FLOAT), # 垂直通道噪声。垂直通道的噪声电平。
            ('HorizontalCalibration', FLOAT), # 水平通道标定值。水平通道的反射率标定常数。
            ('VerticalCalibration', UINT16), # 垂直通道标定值。垂直通道的反射率标定常数。
            ('HorizontalNoiseTemperature', FLOAT), # 水平通道噪声温度
            ('VerticalNoiseTemperature', FLOAT), # 垂直通道噪声温度
            ('ZDR_Calibration', FLOAT), # ZDR标定偏差
            ('PHIDP_Calibration', FLOAT), # 差分相移标定偏差
            ('LDR_Calibration', FLOAT), # 系统LDR标定偏差
            ('Reserved', '40s') # 保留字段。
            )

    def CutConfig(self): # 扫描配置
        return (
            ('ProcessMode', UINT32), # 处理模式。1 - PPP 2 - FFT。
            ('WaveForm', UINT32), # 波形类别。0 – CS连续监测 1 – CD连续多普勒 2 – CDX多普勒扩展 3 – Rx Test 4 – BATCH批模式 5 – Dual PRF双PRF 6 - Staggered PRT 参差PRT。
            ('PRF1', FLOAT), # 脉冲重复频率1。对于Batch、双PRF和参差PRT模式，表示高PRF值。对于其它单PRF模式，表示唯一的PRF值。
            ('PRF2', FLOAT), # 脉冲重复频率2。对Batch、双PRF和参差PRT模式，表示低PRF值。对其它单PRF模式，无效。
            ('DealiasingMode', UINT32), # 速度退模糊方法。1 – 单PRF 2 –双PRF3:2模式 3 –双PRF4:3模式 4 –双PRF 5:4模式。
            ('Azimuth', FLOAT), # 方位角。RHI模式的方位角。
            ('Elevation', FLOAT), # 俯仰角。PPI模式的俯仰角。
            ('StartAngle', FLOAT), # 起始角度。PPI扇扫的起始方位角，或RHI模式的高限仰角。
            ('EndAngle', FLOAT), # 结束角度。PPI扇扫的结束方位角，或RHI模式的低限仰角。
            ('AngularResolution', FLOAT), # 角度分辨率。径向数据的角度分辨率，仅用于PPI扫描模式。
            ('ScanSpeed', FLOAT), # 扫描速度。PPI扫描的方位转速，或RHI扫描的俯仰转速。
            ('LogResolution', UINT32), # 强度分辨率。强度数据的距离分辨率。
            ('DopplerResolution', UINT32), # 多普勒分辨率
            ('MaximumRange1', UINT32), # 最大距离1。对应脉冲重复频率1的最大可探测距离。
            ('MaximumRange2', UINT32), # 最大距离2。对应脉冲重复频率2的最大 可探测距离。
            ('StartRange', UINT32), # 起始距离。数据探测起始距离。
            ('Sample1', UINT32), # 采样个数1。对应于脉冲重复频率1的采样个数。
            ('Sample2', UINT32), # 采样个数2。对应于脉冲重复频率2的采样个数。
            ('PhaseMode', UINT32), # 相位编码模式。1 – 固定相位 2 – 随机相位 3 – SZ编码。
            ('AtmosphericLoss', FLOAT), # 大气衰减。双程大气衰减值，精度为小数点后保留6位。
            ('NyquistSpeed', FLOAT), # 最大不模糊速度。理论最大不模糊速度。

            # 奇葩BUG，1个long8字节，但是两个long是24字节！，这里只能变通用连个int代替。
            ('MomentsMask', UINT32), # 数据类型掩码。以掩码的形式表示当前允许获取的数据类型，其中：0–不允许获取数据 1 –允许获取数据。具体掩码定义见表2-6。
            ('MomentsMask1', UINT32), # 数据类型掩码。以掩码的形式表示当前允许获取的数据类型，其中：0–不允许获取数据 1 –允许获取数据。具体掩码定义见表2-6。
            ('MomentsSizeMask', UINT32), # 数据大小掩码。以掩码形式表示每种数据类型字节数，其中：0–1个字节 1 – 2个字节 对应数据类型顺序同表2-6。
            ('MomentsSizeMask1', UINT32), # 数据大小掩码。以掩码形式表示每种数据类型字节数，其中：0–1个字节 1 – 2个字节 对应数据类型顺序同表2-6。

            ('MiscFilterMask', UINT32), # 滤波设置掩码。0–未应用 1– 应用 具体掩码定义见表2-7。
            ('SQI_Threshold', FLOAT), # SQI门限
            ('SIG_Threshold', FLOAT), # SIG门限
            ('CSR_Threshold', FLOAT), # CSR门限
            ('LOG_Threshold', FLOAT), # LOG门限
            ('CPA_Threshold', FLOAT), # CPA门限
            ('PMI_Threshold', FLOAT), # PMI门限
            ('DPLOG_Threshold', FLOAT), # PMI门限
            ('Thresholds_r', '4s'), # 阈值门限保留
            ('dBT_Mask', UINT32), # dBT质控掩码。dBT数据使用的质控门限掩码，其中：0–未应用 1–应用 具体掩码位定义见表2-8。
            ('dBZ_Mask', UINT32), # dBZ质控掩码。dBZ数据使用的质控门限掩码，具体掩码位定义见表2-8，其中：0–未应用 1–应用。
            ('VelocityMask', UINT32), # 速度质控掩码。速度数据使用的质控门限掩码，具体掩码位定义见表2-8，其中：0–未应用 1–应用。
            ('SpectrumWidthMask', UINT32), # 谱宽质控掩码。谱宽数据使用的质控门限掩码，具体掩码位定义见表2-8，其中：0–未应用 1–应用。
            ('DP_Mask', UINT32), # 偏振量质控掩码。偏振量数据使用的质控门限掩码，具体掩码位定义见表2-8，其中：0–未应用 1–应用。
            ('MaskReserved', '12s'), # 质控掩码保留位。保留，用于标识质控方法。
            ('ScanSync', UINT32), # 扫描同步标志。保留，用于多部雷达同步扫描标识。
            ('Direction', UINT32), # 天线运行方向。仅对PPI模式有效 1 – 顺时针 2 – 逆时针。
            ('GroundClutter', UINT16), # 地物杂波图类型。1 – 所有数据不滤波 2 – 全程滤波 3 – 使用实时动态滤波图 4 – 使用静态滤波图。
            ('GroundClutterFilterType', UINT16), # 地物滤波类型。0 –不滤波 1 – 频域自适应滤波 2 - 固定宽带频域滤波器 3 - 可变宽带频域滤波器 4 - 可变最小方差频域滤波器 5 – IIR时域滤波。
            ('GroundClutterFilterNotchWidth', UINT16), # 地物滤波宽度
            ('GroundClutterFilterWindow', UINT16), # 滤波窗口类型。滤波算法FFT窗口类型 0 – 矩形窗 1 – 汉明窗 2 – Blackman窗 3 – 自适应窗口 4 – 无。
            ('Reserved', '72s') # 保留字段。

            #//表2-6 数据类型掩码定义 BIT(LSB) 比特位/值   MOMENT 数据类型   REMARKS 描述
            #//1   dBT   滤波前反射率（Total Reflectivity）
            #//2   dBZ   滤波后反射率(Reflectivity)
            #//3   V   径向速度(Doppler Velocity)
            #//4   W   谱宽（Spectrum Width）
            #//5   SQI   信号质量指数（Signal Quality Index）
            #//6   CPA   杂波相位一致性（Clutter Phase Alignment）
            #//7   ZDR   差分反射率（Differential Reflectivity）
            #//8   LDR   退偏振比（Liner Differential Ratio）
            #//9   CC   协相关系数（Cross Correlation Coefficient）
            #//10   ΦDP   差分相移（Differential Phase）
            #//11   KDP   差分相移率（Specific Differential Phase）
            #//12   CP   杂波可能性（Clutter Probability）
            #//13   Reserved   数据标志，保留
            #//14   HCL   双偏振相态分类（Hydro Classification）
            #//15   CF   杂波标志（Clutter Flag）
            #//16   SNRH   水平通道信噪比（horizontal Signal Noise Ratio）
            #//17-31   Reserved   数据标志，保留
            #//32   Zc   订正后反射率（Corrected Reflectivity）
            #//33   Vc   订正后径向速度(Corrected Doppler Velocity)
            #//34   Wc   订正后谱宽（Corrected Spectrum Width）
            #//35   ZDRc   订正后差分反射率(Corrected Differential Reflectivity)

            #//表 2-7 滤波设置掩码定义 BIT(LSB)比特位/值   FILTER 滤波方法   REMARKS 描述
            #//0   干扰过滤   基于脉冲检查的干扰过滤算法
            #//1   奇异点过滤   奇异点过滤算法
            #//2   一维反射率点杂波过滤   对反射率数据使用的一维点杂波过滤
            #//3   一维多普勒点杂波过滤   对多普勒数据使用的一维点杂波过滤
            #//4   二维反射率数据点杂波过滤   对反射率数据使用的二维（3*3方位和距离）点杂波过滤
            #//5   二维多普勒点杂波过滤   对多普勒数据使用的二维（3*3方位和距离）点杂波过滤
            #//6-31   保留

            #//表 2-8 质控门限定义 BIT(LSB) 比特位/值   Threshold 门限   REMARKS 描述
            #//0   SQI   信号质量指数
            #//1   SIG   天气信号强度
            #//2   CSR   地物杂波与天气信号比率
            #//3   LOG   信噪比
            #//4   CPA   地物杂波相位稳定指数
            #//5   PMI   极化天气信号指数
            #//6   DPLOG   偏振量信噪比
            #//7-31   Reserved   保留
            )

    def RadialHeader(self):
        return (
            ('RadialState', UINT32), # 径向数据状态。0–仰角开始 1–中间数据 2–仰角结束 3–体扫开始 4–体扫结束 5–RHI开始 6–RHI结束。
            ('SpotBlank', UINT32), # 消隐标志。0–正常 1–消隐。
            ('SequenceNumber', UINT32), # 序号。每个体扫径向从1计数。
            ('RadialNumber', UINT32), # 径向数。每个扫描从1计数。
            ('ElevationNumber', UINT32), # 仰角编号。仰角编号，每个体扫从1计数。
            ('Azimuth', FLOAT), # 方位角。扫描的方位角度。
            ('Elevation', FLOAT), # 仰角。扫描的俯仰角度。
            ('Seconds', UINT32), # 秒。径向数据采集的时间，UTC计数的秒数,从1970年1月1日0时开始计数。
            ('Microseconds', UINT32), # 微秒。径向数据采集的时间除去UTC秒数后，留下的微秒数。
            ('LengthOfData', UINT32), # 数据长度。仅本径向数据块所占用的长度。
            ('MomentNumber', UINT32), # 数据类别数量。径向数据类别（如Z，V，W等各占一种）的数量。
            ('Reserved', '20s') # 保留字段
           )

    def RadialDataHeader(self):
        return (
            ('DataType', UINT32), # 数据类型。具体径向数据类型见表2-6。
            ('Scale', UINT32), # 比例。数据编码的比例。
            ('Offset', UINT32), # 偏移。数据编码的偏移。
            ('BinLength', UINT16), # 库字节长度。保存一个距离库值用的字节数。
            ('Flags', UINT16), # 标志。数据标志位，暂不使用。
            ('Length', UINT32), # 长度。距离库数据的长度，不包括当前的径向数据头大小。
            ('Reserved', '12s') # 保留字段
            )

# 数据结构类库，实例化
dtype_SAD = CinradSADFormat()